package model

import (
	"fmt"
	"gitee.com/liumou_site/gf"
	"gitee.com/liumou_site/logger"
	"io"
	"net/http"
	"os"
	"path"
	"path/filepath"
	"strings"
	"sync"
)

func StartDownLoadFile(url, id, savePath string, wg *sync.WaitGroup) {
	defer wg.Done()
	d := gf.NewFile(path.Join(savePath, id))
	d.Exists()
	if d.ExIst {
		d.DeleteFile()
	}
	logger.Info("当前设置ID: ", id)
	url = strings.Replace(url, string('"'), "", -1)
	logger.Info("正在下载文件: ", url)
	err := SingleDownloadFile(url, id, savePath)
	if err != nil {
		logger.Error("下载失败: ", err)
		return
	}
	logger.Info("下载成功: ", url, " -> ", path.Join(savePath, id))
	d.Exists()
	if d.ExIst {
		d.DeleteFile()
		if d.Err == nil {
			logger.Info("删除成功: ", path.Join(savePath, id))
		} else {
			logger.Error("删除失败: ", path.Join(savePath, id))
		}
	}
}

// SingleDownloadFile 单线程下载文件
func SingleDownloadFile(url, file, savePath string) error {
	file = filepath.Join(savePath, file)
	d := filepath.Dir(file)
	f := gf.NewFile(d)
	f.IsDir()
	if !f.IsDirs {
		f.Mkdir(d, 0755)
	}
	// 发起HTTP GET请求
	response, err := http.Get(url)

	if err != nil {
		return fmt.Errorf("无法下载文件：%v", err)
	}
	defer func(Body io.ReadCloser) {
		err := Body.Close()
		if err != nil {
			return
		}
	}(response.Body)

	// 创建输出文件
	logger.Info("正在写入文件: ", file)
	output, err := os.Create(file)
	if err != nil {
		return fmt.Errorf("无法创建输出文件：%v", err)
	}
	defer func(output *os.File) {
		err := output.Close()
		if err != nil {
			return
		}
	}(output)
	// 将HTTP响应的内容写入输出文件
	_, err = io.Copy(output, response.Body)
	if err != nil {
		logger.Error(file)
		return fmt.Errorf("写入文件时出错：%v", err)
	}
	logger.Info("下载成功: ", file)
	return nil
}
